#pragma once
#include "gtest/gtest.h"
#include "Utility/FileSystem/SGFileSystem.h"
#include "../Interface/BeamSectionNumericalCalculatorFactory.h"
#include "../HatSectionNumericalCalculator.h"
#include "../SectionCalculator/writeVtk.h"

using SG::DataStructure::FEM::BeamSectionStandardTypes;
using SG::DataStructure::FEM::PBARLData;
using SG::FEMSolver::Element::BeamSectionNumericalCalculatorFactory;
using SG::FEMSolver::Element::HatSectionNumericalCalculator;

// 将 BeamSectionNumericalCalculatorFactory 生成对象测试放置在具体截面属性计算中
TEST (BeamSectionNumericalCalculatorFactoryTest, HatSectionCalculatorCreate)
{
    // Test data
    auto calculatorPtr = BeamSectionNumericalCalculatorFactory::Create (BeamSectionStandardTypes::BEAMSECTYPE_HAT);
    auto hatCalculatorPtr = dynamic_cast<HatSectionNumericalCalculator*> (calculatorPtr.get ());

    // Check
    ASSERT_TRUE (nullptr != hatCalculatorPtr);
}

// Hat 截面网格划分测试
TEST (BeamSectionNumericalMeshTest, HatSection)
{
    // Input data
    PBARLData section;
    section.SetBeamSectionStandardTypes (BeamSectionStandardTypes::BEAMSECTYPE_HAT);
    section.m_dimension = {6.0, 2.0, 6.0, 2.0};
    int refineLevel{1};

    // Test data
    Meshes meshes;
    HatSectionNumericalCalculator HatSecMesher;
    HatSecMesher.Mesh (section, _OUT meshes, refineLevel);
    std::string filename = "HatBeamSectionMesh";
    std::string discription = "HAT-Type Beam Section Mesh";
    SG::FEMSolver::Element::writeVtk (meshes, filename, discription);
    auto fileTest = SG::Utility::FileSystem::getFullPath (filename + ".vtk");

    // Target data
    auto fileTarget = SG::Utility::FileSystem::getTestDataPath ("SGFem/BeamSecPropCalculator/" + filename + "Target.vtk");

    // Check
    ASSERT_TRUE (SG::Utility::FileSystem::compareVTK (fileTarget, fileTest));
}